from matplotlib import pyplot as plt
import matplotlib.patches as mpatches

import numpy as np

# Affichage de la table
def AfficheTable(S1, S2, D):
    n = len(S1)
    m = len(S2)

    # Créer une matrice RGB avec 2 lignes et 2 colonnes supplémentaires pour les en-têtes
    mat = np.zeros((n+3, m+3, 3))

    # Couleur des cases d'en-tête (bleu clair)
    header_color = [0.85, 0.85, 1.0]

    # Remplir les en-têtes
    for j in range(m+3):
        mat[0][j] = header_color  # Ligne des indices j
        mat[1][j] = header_color  # Ligne des caractères S2
    for i in range(n+3):
        mat[i][0] = header_color  # Colonne des indices i
        mat[i][1] = header_color  # Colonne des caractères S1

    # Remplir les données
    for i in range(n+1):
        for s in range(m+1):
            if (i, s) in D:
                mat[i+2][s+2] = [0.2, 0.7, 0.3]  # Vert
            else:
                mat[i+2][s+2] = [0.85, 0.85, 0.85]  # Gris clair

    plt.close('all')
    fig, ax = plt.subplots(figsize=((m+3)*0.4, (n+3)*0.4))
    ax.imshow(mat)

    # Afficher les valeurs dans chaque case de données
    for i in range(n+1):
        for s in range(m+1):
            if (i, s) in D:
                valeur = D[(i, s)]
                ax.text(s+2, i+2, str(int(valeur)), ha='center', va='center',
                        color='white', fontsize=9, fontweight='bold')

    # Afficher les indices j (ligne 0)
    for j in range(m+1):
        ax.text(j+2, 0, str(j), ha='center', va='center', color='black', fontsize=9)

    # Afficher les caractères S2 (ligne 1)
    for j in range(m+1):
        char = ' ' if j == 0 else S2[j-1]
        ax.text(j+2, 1, char, ha='center', va='center', color='red', fontsize=9, fontweight='bold')

    # Afficher les indices i (colonne 0)
    for i in range(n+1):
        ax.text(0, i+2, str(i), ha='center', va='center', color='black', fontsize=9)

    # Afficher les caractères S1 (colonne 1)
    for i in range(n+1):
        char = ' ' if i == 0 else S1[i-1]
        ax.text(1, i+2, char, ha='center', va='center', color='red', fontsize=9, fontweight='bold')

    # Labels des en-têtes (coin supérieur gauche)
    ax.text(0, 0, '', ha='center', va='center', color='black', fontsize=9, fontweight='bold')
    ax.text(1, 0, 'j', ha='center', va='center', color='black', fontsize=9, fontweight='bold')
    ax.text(0, 1, 'i', ha='center', va='center', color='black', fontsize=9, fontweight='bold')
    ax.text(1, 1, '', ha='center', va='center', color='black', fontsize=9, fontweight='bold')

    # Légendes des axes (en dehors de la matrice)
    ax.text((m+3)/2, -0.8, 'Préfixe S2', ha='center', va='center', color='black', fontsize=11, )
    ax.text(-0.8, (n+3)/2, 'Préfixe S1', ha='center', va='center', color='black', fontsize=11, rotation=90)

    # Quadrillage complet sur la matrice
    # Lignes horizontales
    for i in range(n+4):
        ax.plot([-0.5, m+2.5], [i-0.5, i-0.5], color='black', linewidth=1)
    # Lignes verticales
    for j in range(m+4):
        ax.plot([j-0.5, j-0.5], [-0.5, n+2.5], color='black', linewidth=1)

    # Cacher les axes et les spines (bordures du graphique)
    ax.set_xticks([])
    ax.set_yticks([])
    for spine in ax.spines.values():
        spine.set_visible(False)

    # Ajuster les limites pour voir les légendes
    ax.set_xlim(-1.5, m+2.5)
    ax.set_ylim(n+2.5, -1.5)

    plt.title('Table de programmation dynamique', pad=10)
    plt.tight_layout()
    plt.show()


# Séquences ADN à comparer
seq1 = "ACGTAC"
seq2 = "AGTCAT"
L = {}  # Table de mémoïsation

reference = "ACGTAC"
candidates = ["ACGT", "CGTA", "GTAC", "TACG"]

























